# coding:utf-8
# 自动部署python代码

import os
import sys
import chardet
import urllib
import subprocess
import win32api
import time,shutil
"""
需求：
    1.关闭现有程序
    2.备份当前程序到备份目录: 改名-->移动
    3.复制文件(考虑压缩与解压缩)到服务器指定文件夹
    4.运行程序
"""
def shutdown_prj(dir):
    """
    :function: 关闭程序
    :param dir:文件保存路径
    :author:shong 2017-06-17
    :return:
    """

    # 处理python进程
    print u'=============start to shutdown python and nodejs process============='
    py_port = ['8080']
    py_pid = []
    for port in py_port:
        p = os.popen("netstat -aon|findstr \"%s\"" % port)        # 通过端口查询python的进程id
        rst = p.read()
        print 'netstat find pord %s \n' % port,rst
        print 'split results as \n', rst.split()
        if rst and rst.split()[-1]!=0:
            py_pid.append(rst.split()[-1])
    if py_pid:
        pid_str = ','.join(py_pid)
        pid_len = len(py_pid)
        print u'\nThere are %s python pids:%s' % (pid_len,pid_str)
        for id in py_pid:
            os.system("TASKKILL /PID %s /F" % id)              # kill进程id
            print u'Killed pid %s' % id
    else:
        print u'python ports %s all are not running' % ','.join(py_pid)

    # 处理node进程
    p = os.popen("tasklist | findstr \"node.exe\"")
    print '\nnetstat findstr node.exe \n', p.read()
    # p = os.popen("tasklist /FI \"IMAGENAME eq node.exe\"")
    if p.read():                                                  # 查询node程序，存在则关闭
        print u'node.exe is running.'
        os.system("TASKKILL /IM node.exe /F")
        print u'Killed node.exe'
    else:
        print u'nodejs isnot running.'
    # win32api.ShellExecute(0, 'open', 'shutdownpy.bat', '', dir, 1)  # python程序
    # win32api.ShellExecute(0, 'open', 'shutdownjs.bat', '', dir, 1)  # node程序


def backup_old_file():
    dir = r'E:\project\16trust\WebplatModules\test'
    if os.path.exists(dir):
        # message = 'OK, the "%s" file exists.'
        # 1-重命名旧文件
        new_name = dir +'_'+ time.strftime("%Y-%m-%d_%H_%M_%S",time.localtime())
        os.rename(dir,new_name)
        # 2-备份旧文件
        file_move_to = r'E:\project\16trust\WebplatModules\move'
        shutil.move(new_name, file_move_to)
        # 3-复制新文件到目录
        file_from = r'E:\project\16trust\WebplatModules\move\test_new'
        shutil.copytree(file_from, r'E:\project\16trust\WebplatModules\test_new')
        print 'sucess...'
    else:
        print 'failed...'
        # message = "Sorry, I cannot find the '%s' file."
    # print message % dir


def start_prj(dir):
    """
    :function:运行bat文件启动程序
    :param dir:文件保存路径
    :author:shong 2017-06-17
    :model：ShellExecute(hwnd, op , file , params , dir , bShow )
            参数:
                hwnd：父窗口的句柄，如果没有父窗口，则为0。
                op：要进行的操作，为“open”、“print”或者为空。
                file：要运行的程序，或者打开的脚本。
                params：要向程序传递的参数，如果打开的为文件，则为空。
                dir：程序初始化的目录。
                bShow：是否显示窗口。
    :refence: https://my.oschina.net/u/576757/blog/121660
    """
    print u'\n=============start to restart python and nodejs process============='
    print u'start python'
    os.startfile(dir+'startpy.bat')
    print u'python is running'
    time.sleep(15)
    print u'start nodejs'
    os.startfile(dir+'startjs.bat')
    print u'nodejs is running'
    # win32api.ShellExecute(0, 'open', 'startpy.bat', '', dir, 1)  # python程序
    # win32api.ShellExecute(0, 'open', 'startjs.bat', '', dir, 1)  # node程序


def regard_code():
    # print 'system defaultencoding=',sys.getdefaultencoding()       # 系统当前编码
    # 1-python的OS模块
    # cmd = "cd D:/nodejs/daye;node start.j"

    # cmd = 'dir'
    # os.system(cmd)                                                   # 直接执行cmd命令

    p = os.popen(cmd).read()                                       # 得到返回的字符串，并读取字符串
    # p = urllib.urlopen('http://www.chinaunix.net').read()          # 打开网站，获取文件流，并读取

    # print chardet.detect(p)                                         # 判断字符串的编码 {'confidence': 0.99, 'encoding': 'GB2312'}
    print p.decode('GBK').encode('utf-8')                           # pycharm控制台中文乱码

    # 2-在当前进程下面产生子进程，执行命令
    # child = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE)  # subprocess.PIPE 为文本流提供一个缓存区
    # child.wait()                                                     # 父进程等待子进程
    # print child.stdout.read().decode('GBK').encode('utf-8')
    # reference http://blog.sina.com.cn/s/blog_9b78c91101019ph8.html

def main():
    dir_bat = 'E:\\project\\16trust\\0-bat\\'
    shutdown_prj(dir_bat)
    # backup_old_file()
    time.sleep(2)
    start_prj(dir_bat)
    input('Enter number 1 to exit')

if __name__ == '__main__':
    main()